{"componentChunkName":"component---src-templates-blog-post-blog-post-js","path":"/articulos/spec_driven_development/","result":{"data":{"mdx":{"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Spec Driven Development: qué es y cómo aplicarlo con agentes de IA\",\n  \"date\": \"2026-08-24\",\n  \"description_sort\": \"Qué es Spec Driven Development y cómo usar especificaciones para desarrollar con agentes de IA\",\n  \"description\": \"Aprende qué es Spec Driven Development (SDD), cómo crear especificaciones útiles y cómo aplicarlo con agentes de IA, tests y herramientas como OpenSpec o GitHub Spec Kit.\",\n  \"featuredImage\": \"spec-driven-development-portada.webp\",\n  \"twitterUsername\": \"@CursosDesarrol1\",\n  \"tags\": [\"inteligencia-artificial\", \"agentes-ia\", \"desarrollo-software\", \"spec-driven-development\", \"codex\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"span\", {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"836px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/55953b7c7c650c0a03170f17a7c1f582/aebd0/spec-driven-development-portada.webp\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"56.333333333333336%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRooAAABXRUJQVlA4IH4AAAAQBACdASoUAAsAPtFUo0uoJKMhsAgBABoJaACdAYuu260GrwU1szXNIAD+9doxt07cncxi1F+ykaio4eLt4itRKabcXLiqw1cJaJJIoEMN7TYfcUQSmdgLN3Pa4KZg5QAD1/Ko5c8doebM06YmD+SVBoX7GyEDCG61lsj85gA=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Ilustración de una especificación que guía a un agente de IA desde los requisitos hasta el código validado\",\n    \"title\": \"Ilustración de una especificación que guía a un agente de IA desde los requisitos hasta el código validado\",\n    \"src\": \"/static/55953b7c7c650c0a03170f17a7c1f582/aebd0/spec-driven-development-portada.webp\",\n    \"srcSet\": [\"/static/55953b7c7c650c0a03170f17a7c1f582/cb58d/spec-driven-development-portada.webp 300w\", \"/static/55953b7c7c650c0a03170f17a7c1f582/f8b1b/spec-driven-development-portada.webp 600w\", \"/static/55953b7c7c650c0a03170f17a7c1f582/aebd0/spec-driven-development-portada.webp 836w\"],\n    \"sizes\": \"(max-width: 836px) 100vw, 836px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), mdx(\"br\", null), mdx(\"br\", null), mdx(\"h1\", null, \"Spec Driven Development: qu\\xE9 es y c\\xF3mo aplicarlo con agentes de IA\"), mdx(\"br\", null), mdx(\"p\", null, \"Pedir a un agente de IA \\xABa\\xF1ade autenticaci\\xF3n\\xBB puede producir una primera versi\\xF3n de c\\xF3digo en minutos. Pero tambi\\xE9n le obliga a adivinar decisiones que no estaban en la petici\\xF3n: qu\\xE9 proveedor usar, d\\xF3nde guardar la sesi\\xF3n, c\\xF3mo tratar los enlaces caducados, qu\\xE9 reglas de seguridad respetar o c\\xF3mo probar el resultado. \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Spec Driven Development (SDD)\"), \" propone cambiar el punto de partida: acordar una especificaci\\xF3n antes de implementar.\"), mdx(\"p\", null, \"En este enfoque, la especificaci\\xF3n no es documentaci\\xF3n que se redacta al final. Es un artefacto versionado que explica qu\\xE9 se construye, por qu\\xE9, cu\\xE1les son sus l\\xEDmites y c\\xF3mo se comprobar\\xE1. Sirve a producto, al equipo de ingenier\\xEDa y al agente que ejecuta el trabajo. El c\\xF3digo sigue siendo importante, pero deja de ser el \\xFAnico lugar donde vive la intenci\\xF3n.\"), mdx(\"h2\", null, \"\\xBFQu\\xE9 es Spec Driven Development?\"), mdx(\"p\", null, \"Spec Driven Development, o desarrollo guiado por especificaciones, es una forma de trabajar en la que \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"la especificaci\\xF3n precede y dirige al c\\xF3digo\"), \". Antes de abrir un editor o lanzar una tarea a un agente, se describe el cambio con el detalle suficiente para tomar decisiones y validar el resultado.\"), mdx(\"p\", null, \"Una buena definici\\xF3n pr\\xE1ctica es esta:\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"Intenci\\xF3n de producto \\u2192 Especificaci\\xF3n verificable \\u2192 Plan \\u2192 Implementaci\\xF3n \\u2192 Validaci\\xF3n\"), mdx(\"br\", null), mdx(\"p\", null, \"No es una metodolog\\xEDa cerrada ni sin\\xF3nimo de documentaci\\xF3n extensa. Tampoco sustituye a Agile, TDD o BDD. SDD aporta el marco de un cambio; TDD puede asegurar el comportamiento de una unidad de c\\xF3digo y BDD puede expresar escenarios de negocio de extremo a extremo. En un flujo maduro, las tres pr\\xE1cticas se complementan.\"), mdx(\"p\", null, \"La diferencia cobra fuerza con los agentes de IA. Un prompt vago deja que el modelo complete huecos sobre arquitectura, reglas de negocio y casos de error. Una spec reduce esa ambig\\xFCedad y ofrece una referencia persistente que se puede revisar en una pull request.\"), mdx(\"span\", {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1000px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/140ea056f8ac969577b342a4116d62aa/03f31/spec-driven-development-contraste.webp\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"56.333333333333336%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRnYAAABXRUJQVlA4IGoAAACQAwCdASoUAAsAPtFUo0uoJKMhsAgBABoJZACdACP5szU7T4AAAP70lTmniW+54PVVSTc1MvIgS7Va/WiZK9S2S3S2iDxBHv/PLfe2Z96bhnbQnnQrm3zNNidCuwytNq8fFoAwhjSFAAAA')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Contraste visual entre una petición ambigua y un flujo de desarrollo guiado por una especificación\",\n    \"title\": \"Contraste visual entre una petición ambigua y un flujo de desarrollo guiado por una especificación\",\n    \"src\": \"/static/140ea056f8ac969577b342a4116d62aa/03f31/spec-driven-development-contraste.webp\",\n    \"srcSet\": [\"/static/140ea056f8ac969577b342a4116d62aa/cb58d/spec-driven-development-contraste.webp 300w\", \"/static/140ea056f8ac969577b342a4116d62aa/f8b1b/spec-driven-development-contraste.webp 600w\", \"/static/140ea056f8ac969577b342a4116d62aa/03f31/spec-driven-development-contraste.webp 1000w\"],\n    \"sizes\": \"(max-width: 1000px) 100vw, 1000px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), mdx(\"br\", null), mdx(\"br\", null), mdx(\"h2\", null, \"Por qu\\xE9 SDD es \\xFAtil al programar con IA\"), mdx(\"p\", null, \"Los agentes pueden explorar un repositorio, modificar varios archivos, crear pruebas y ejecutar comandos. Esa capacidad acelera la implementaci\\xF3n, pero no convierte una petici\\xF3n ambigua en un requisito correcto. Si el contexto solo existe en el historial de chat, puede perderse entre sesiones o interpretarse de forma distinta por cada persona y cada agente.\"), mdx(\"p\", null, \"La spec funciona como un contrato de trabajo. Deja claro lo que debe suceder, lo que no debe cambiar y qu\\xE9 evidencia hace falta para considerar la tarea terminada. As\\xED, la revisi\\xF3n humana puede empezar por las decisiones y los criterios de aceptaci\\xF3n, no \\xFAnicamente por cada l\\xEDnea generada.\"), mdx(\"p\", null, \"Esto no vuelve determinista a un modelo ni elimina el code review. Lo que hace es disminuir el espacio en el que el agente tiene que improvisar. La documentaci\\xF3n oficial de \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/Fission-AI/OpenSpec\"\n  }, \"OpenSpec\"), \" describe precisamente una capa ligera para acordar qu\\xE9 construir antes de escribir c\\xF3digo; \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/github/spec-kit\"\n  }, \"GitHub Spec Kit\"), \" plantea un ciclo de principios, especificaci\\xF3n, plan, tareas, implementaci\\xF3n y convergencia.\"), mdx(\"h2\", null, \"Qu\\xE9 debe incluir una especificaci\\xF3n \\xFAtil\"), mdx(\"p\", null, \"La mejor spec no es la m\\xE1s larga, sino la que permite tomar las decisiones necesarias sin imponer detalles accidentales de implementaci\\xF3n. Para una funcionalidad de tama\\xF1o medio, conviene incluir al menos estas piezas:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Problema y objetivo:\"), \" qui\\xE9n tiene el problema y qu\\xE9 resultado se quiere conseguir.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Alcance:\"), \" comportamiento incluido y lo que queda expl\\xEDcitamente fuera.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Requisitos y criterios de aceptaci\\xF3n:\"), \" reglas observables, preferiblemente con escenarios concretos.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Restricciones:\"), \" seguridad, rendimiento, compatibilidad, datos sensibles, APIs existentes o decisiones que no deben alterarse.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Casos l\\xEDmite y errores:\"), \" qu\\xE9 ocurre con datos vac\\xEDos, permisos insuficientes, reintentos o fallos de red.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Plan y validaci\\xF3n:\"), \" \\xE1reas afectadas, tareas y pruebas que deben pasar.\")), mdx(\"p\", null, \"Una distinci\\xF3n importante: la \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"spec define el qu\\xE9 y el porqu\\xE9\"), \"; el dise\\xF1o t\\xE9cnico explica el c\\xF3mo. En ocasiones ambos documentos ser\\xE1n breves; en un cambio con impacto arquitect\\xF3nico conviene separarlos para poder discutir el comportamiento sin confundirlo con una librer\\xEDa concreta.\"), mdx(\"h3\", null, \"Ejemplo: recuperaci\\xF3n de contrase\\xF1a\"), mdx(\"p\", null, \"\\xABA\\xF1ade recuperaci\\xF3n de contrase\\xF1a\\xBB no permite saber si el resultado es correcto. Una especificaci\\xF3n inicial podr\\xEDa ser:\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"Objetivo: permitir recuperar el acceso sin revelar si un correo existe.\", mdx(\"br\", null), mdx(\"br\", null), \"Requisitos:\", mdx(\"br\", null), \"\\u2022 El formulario acepta un correo v\\xE1lido y muestra siempre el mismo mensaje de confirmaci\\xF3n.\", mdx(\"br\", null), \"\\u2022 El enlace expira a los 30 minutos y solo puede utilizarse una vez.\", mdx(\"br\", null), \"\\u2022 La nueva contrase\\xF1a invalida las sesiones activas.\", mdx(\"br\", null), mdx(\"br\", null), \"Restricciones:\", mdx(\"br\", null), \"\\u2022 Reutilizar el servicio de correo y el proveedor de tokens ya existentes.\", mdx(\"br\", null), \"\\u2022 Aplicar l\\xEDmite de solicitudes por direcci\\xF3n IP y no registrar tokens.\", mdx(\"br\", null), mdx(\"br\", null), \"Validaci\\xF3n: tests unitarios de token, integraci\\xF3n del endpoint y prueba end-to-end del flujo.\"), mdx(\"br\", null), mdx(\"p\", null, \"La spec no dicta todav\\xEDa el nombre de cada funci\\xF3n. Sin embargo, evita que el agente elija un comportamiento inseguro o incompatible por falta de informaci\\xF3n.\"), mdx(\"h2\", null, \"El ciclo de trabajo: de la idea a una implementaci\\xF3n verificable\"), mdx(\"p\", null, \"Un ciclo SDD puede ser ligero. La clave es que haya una pausa expl\\xEDcita entre entender el cambio y modificar el c\\xF3digo.\"), mdx(\"span\", {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/521b280bbdf1a3128d7d6a89ff1a8d8e/6ef61/spec-driven-development-ciclo.webp\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"56.333333333333336%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRnIAAABXRUJQVlA4IGYAAACwAwCdASoUAAsAPtFUpEuoJKOhsAgBABoJQBdgBDv7q8Aa+YgIAAD+9FkkRYRj38SjhU2v3UWGlYRsitYImGXdwj3iR3ZFN90YMttUmI041FPIX/3j8X2vB7S84pq6YZc/hD1AAAA=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Flujo de Spec Driven Development desde el objetivo hasta la validación humana y automática\",\n    \"title\": \"Flujo de Spec Driven Development desde el objetivo hasta la validación humana y automática\",\n    \"src\": \"/static/521b280bbdf1a3128d7d6a89ff1a8d8e/5bb53/spec-driven-development-ciclo.webp\",\n    \"srcSet\": [\"/static/521b280bbdf1a3128d7d6a89ff1a8d8e/cb58d/spec-driven-development-ciclo.webp 300w\", \"/static/521b280bbdf1a3128d7d6a89ff1a8d8e/f8b1b/spec-driven-development-ciclo.webp 600w\", \"/static/521b280bbdf1a3128d7d6a89ff1a8d8e/5bb53/spec-driven-development-ciclo.webp 1200w\", \"/static/521b280bbdf1a3128d7d6a89ff1a8d8e/6ef61/spec-driven-development-ciclo.webp 1672w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), mdx(\"br\", null), mdx(\"br\", null), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Explorar y delimitar.\"), \" Convertir la petici\\xF3n de negocio en una hip\\xF3tesis de cambio. Revisar c\\xF3digo, usuarios afectados, datos y restricciones.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Especificar.\"), \" Escribir requisitos, escenarios, no objetivos y criterios de aceptaci\\xF3n. Resolver ambig\\xFCedades con la persona responsable antes de implementar.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Dise\\xF1ar y planificar.\"), \" Identificar m\\xF3dulos afectados, decisiones t\\xE9cnicas, riesgos y tareas. Este es el buen momento para que un agente proponga alternativas; no para que elija en silencio.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Implementar.\"), \" Ejecutar tareas peque\\xF1as y trazables contra la spec aprobada.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Verificar.\"), \" Ejecutar tests, an\\xE1lisis est\\xE1tico, build y comprobaciones manuales relevantes. Comparar el resultado con los criterios, no solo con que \\xABcompile\\xBB.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Actualizar y archivar.\"), \" Si cambi\\xF3 el comportamiento del sistema, actualizar la documentaci\\xF3n viva. Conservar la propuesta y las decisiones facilita mantenimiento, auditor\\xEDa y cambios futuros.\")), mdx(\"p\", null, \"El flujo no debe interpretarse como una cascada. Si durante la implementaci\\xF3n aparece un requisito nuevo, se corrige la spec, se revisa el impacto y se contin\\xFAa. La trazabilidad es m\\xE1s valiosa que fingir que el plan inicial era perfecto.\"), mdx(\"h2\", null, \"Especificaciones de sistema y de cambio\"), mdx(\"p\", null, \"En proyectos con agentes conviene separar dos niveles de contexto:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Nivel\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Pregunta que responde\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Ejemplos\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Sistema\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\xAB\\xBFC\\xF3mo se trabaja en este repositorio?\\xBB\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Arquitectura, convenciones, comandos, pol\\xEDticas de seguridad y decisiones persistentes.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Cambio\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\xAB\\xBFQu\\xE9 se construye ahora?\\xBB\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Objetivo de una feature, requisitos, dise\\xF1o, tareas y pruebas.\")))), mdx(\"p\", null, \"El primer nivel puede vivir en \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AGENTS.md\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"CONTRIBUTING.md\"), \", una constituci\\xF3n de proyecto o documentaci\\xF3n por dominios. El segundo debe estar cerca del cambio y bajo control de versiones. Sin reglas de sistema, un agente puede entregar una feature que funciona pero rompe patrones del repositorio; sin una spec de cambio, tendr\\xE1 reglas pero no sabr\\xE1 cu\\xE1l es el resultado esperado.\"), mdx(\"h2\", null, \"OpenSpec y GitHub Spec Kit: dos formas de empezar\"), mdx(\"p\", null, \"No es obligatorio adoptar una herramienta para practicar SDD: una carpeta de Markdown bien mantenida puede ser suficiente. Las herramientas ayudan cuando se quiere repetir el flujo y hacerlo visible para todo el equipo.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"OpenSpec\"), \" organiza el trabajo en especificaciones del sistema y carpetas de cambio. Habitualmente cada cambio contiene una propuesta, especificaciones incrementales, un dise\\xF1o y una lista de tareas. Su gu\\xEDa oficial propone explorar una idea o crear una propuesta antes de aplicar cambios al c\\xF3digo.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"GitHub Spec Kit\"), \" plantea una secuencia expl\\xEDcita: definir principios de proyecto, especificar el qu\\xE9 y el porqu\\xE9, planificar, descomponer en tareas, implementar y converger el resultado contra los artefactos. Es \\xFAtil como referencia para equipos que desean institucionalizar ese ciclo.\"), mdx(\"p\", null, \"La elecci\\xF3n no es una cuesti\\xF3n de marca. Empieza por el grado de estructura que el equipo pueda sostener. Para una feature peque\\xF1a, una spec de una p\\xE1gina y un checklist de validaci\\xF3n pueden ser suficientes. Para una modificaci\\xF3n que afecta varios servicios, datos personales o un contrato p\\xFAblico, el coste de una propuesta m\\xE1s completa suele ser mucho menor que el de corregir malentendidos despu\\xE9s.\"), mdx(\"h2\", null, \"C\\xF3mo introducir SDD sin crear burocracia\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Elige una funcionalidad de riesgo medio.\"), \" Evita tanto el cambio de una l\\xEDnea como la migraci\\xF3n m\\xE1s compleja del producto.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Escribe una spec corta antes de pedir c\\xF3digo.\"), \" Empieza con objetivo, alcance, escenarios, restricciones y validaci\\xF3n.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Revisa el plan antes de ejecutar.\"), \" Pide al agente que identifique archivos afectados, dudas y riesgos. Responde a las dudas que cambien el alcance.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Convierte la definici\\xF3n de terminado en comandos.\"), \" Por ejemplo: \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm run lint\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm test\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm run build\"), \" y una prueba manual definida.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Mide el trabajo de vuelta.\"), \" No solo el tiempo de la primera versi\\xF3n: revisiones, regresiones, aclaraciones y cambios posteriores a QA.\")), mdx(\"p\", null, \"La prueba de que una spec sirve no es que genere muchos archivos Markdown. Es que reduce decisiones reabiertas, hace m\\xE1s clara una revisi\\xF3n y deja el sistema mejor explicado para el siguiente cambio.\"), mdx(\"h2\", null, \"Errores frecuentes\"), mdx(\"h3\", null, \"Confundir especificar con dictar cada l\\xEDnea\"), mdx(\"p\", null, \"Una spec que obliga a copiar una implementaci\\xF3n exacta no aprovecha el conocimiento t\\xE9cnico del equipo ni del agente. Define invariantes, interfaces, resultados y restricciones; deja libertad razonable en los detalles que no afectan al contrato.\"), mdx(\"h3\", null, \"Usar SDD para cualquier ajuste min\\xFAsculo\"), mdx(\"p\", null, \"Un typo o una modificaci\\xF3n trivial no necesita una propuesta formal. La estructura debe ser proporcional al riesgo, al alcance y a la dificultad de revertir el cambio.\"), mdx(\"h3\", null, \"Dejar la spec fuera de Git\"), mdx(\"p\", null, \"Una nota privada o un hilo de chat no es una fuente de verdad compartida. Si la especificaci\\xF3n importa para entender y mantener el software, debe versionarse junto al c\\xF3digo o estar vinculada de forma inequ\\xEDvoca a \\xE9l.\"), mdx(\"h3\", null, \"Dar por bueno el c\\xF3digo generado sin evidencia\"), mdx(\"p\", null, \"Una especificaci\\xF3n aclara la intenci\\xF3n, pero no demuestra que la implementaci\\xF3n sea segura ni correcta. Tests, revisi\\xF3n, observabilidad y despliegues graduales siguen siendo necesarios.\"), mdx(\"h2\", null, \"Preguntas frecuentes sobre Spec Driven Development\"), mdx(\"h3\", null, \"\\xBFSDD sustituye a TDD o BDD?\"), mdx(\"p\", null, \"No. SDD sit\\xFAa el cambio en su contexto de producto y arquitectura. TDD puede seguir guiando la implementaci\\xF3n de componentes y BDD puede expresar escenarios compartidos con negocio. Son capas complementarias.\"), mdx(\"h3\", null, \"\\xBFEs necesario usar IA para aplicar SDD?\"), mdx(\"p\", null, \"No. Especificar antes de implementar es una pr\\xE1ctica anterior a los LLM. La IA ha hecho que sea m\\xE1s urgente, porque multiplica la velocidad con la que un requisito incompleto puede convertirse en c\\xF3digo.\"), mdx(\"h3\", null, \"\\xBFCu\\xE1ndo merece la pena?\"), mdx(\"p\", null, \"Especialmente en funcionalidades con varias reglas de negocio, riesgos de seguridad, integraciones, cambios entre equipos o mantenimiento de un repositorio grande. Para tareas muy peque\\xF1as, basta con una descripci\\xF3n concisa y criterios claros.\"), mdx(\"h3\", null, \"\\xBFQu\\xE9 revisa una persona antes de aprobar?\"), mdx(\"p\", null, \"La intenci\\xF3n, el alcance, los casos l\\xEDmite, las decisiones t\\xE9cnicas relevantes y la evidencia de validaci\\xF3n. Un agente puede preparar gran parte del material, pero la responsabilidad sobre el cambio sigue siendo del equipo.\"), mdx(\"h2\", null, \"Conclusi\\xF3n\"), mdx(\"p\", null, \"Spec Driven Development no promete que un agente de IA acierte siempre. Propone algo m\\xE1s \\xFAtil: convertir una intenci\\xF3n difusa en un contrato que se puede discutir, ejecutar y verificar. Cuanto m\\xE1s aut\\xF3nomo sea el agente, m\\xE1s importante ser\\xE1 tener claros el objetivo, los l\\xEDmites y la evidencia requerida.\"), mdx(\"p\", null, \"El mejor primer paso no es instalar una herramienta ni documentar todo el producto. Es tomar el siguiente cambio relevante, escribir una spec breve y comprobar si el equipo vuelve menos veces atr\\xE1s. Si la respuesta es s\\xED, ya existe una base s\\xF3lida para ampliar el enfoque.\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"twitterUsername":"@CursosDesarrol1","title":"Spec Driven Development: qué es y cómo aplicarlo con agentes de IA","description":"Aprende qué es Spec Driven Development (SDD), cómo crear especificaciones útiles y cómo aplicarlo con agentes de IA, tests y herramientas como OpenSpec o GitHub Spec Kit.","featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/webp;base64,UklGRooAAABXRUJQVlA4IH4AAAAQBACdASoUAAsAPtFUo0uoJKMhsAgBABoJaACdAYuu260GrwU1szXNIAD+9doxt07cncxi1F+ykaio4eLt4itRKabcXLiqw1cJaJJIoEMN7TYfcUQSmdgLN3Pa4KZg5QAD1/Ko5c8doebM06YmD+SVBoX7GyEDCG61lsj85gA=","aspectRatio":1.7699115044247788,"src":"/static/55953b7c7c650c0a03170f17a7c1f582/ccdb5/spec-driven-development-portada.webp","srcSet":"/static/55953b7c7c650c0a03170f17a7c1f582/6b183/spec-driven-development-portada.webp 200w,\n/static/55953b7c7c650c0a03170f17a7c1f582/fc32b/spec-driven-development-portada.webp 400w,\n/static/55953b7c7c650c0a03170f17a7c1f582/ccdb5/spec-driven-development-portada.webp 800w,\n/static/55953b7c7c650c0a03170f17a7c1f582/d6930/spec-driven-development-portada.webp 836w","sizes":"(max-width: 800px) 100vw, 800px"}}}}}},"pageContext":{"slug":"/articulos/spec_driven_development/","previous":{"fields":{"slug":"/avisos_legales/aviso_legal/"}},"next":null}},"staticQueryHashes":["2032873950"]}